#include "Pip.hpp"
class channel // 描述每个任务的窗口
{
public:
    channel(int _code, pid_t _channel_pid, string _name)
        : code(_code), channel_pid(_channel_pid), name(_name)
    {
    }
    int code;          // 写入的文件描述符
    pid_t channel_pid; // 进程的pid;
    string name;       // 子进程的名字
};
vector<channel> channels;
void Meun()
{ // 菜单
    cout << "*******************************************************" << endl;
    cout << "**********             0.EXIT              ************" << endl;
    cout << "**********1.刷新野区              2.刷新兵线************" << endl;
    cout << "**********3清理战场               4.刷新果子 ***********" << endl;
    cout << "*******************************************************" << endl;
}
void Slaver()
{
    while (true)
    {
      
        int comcode = 0;
        int n = read(0, &comcode, sizeof(int));
        if (n == sizeof(int))
        {
            cout<<"["<<getpid()<<"]"<<"#";
            if(comcode>0&&comcode<task.size())task[comcode]();
        }
        if(n==0)break;
    }
}
void control()
{ // 控制子进程执行命令
    int a = 0;
    while (true)
    {
        sleep(1);
        Meun();
        cout << "请输入你要执行的命令：";
        cin>>a;
        if(a==0) break;
        int which = rand() % 10;
        write(channels[which].code, &a, sizeof(a));
    }
}


void clean()
{ 
    for(int i=channels.size()-1;i>=0;i--){
        close(channels[i].code);//关闭子进程的读段
    }
    for(int i=channels.size()-1;i>=0;i--)
    {
        waitpid(channels[i].channel_pid,0,0);
    }
}
void Init()
{
    for (int i = 0; i < 10; i++)
    {
        int fds[2] = {0};
        int pip = pipe(fds); // 先创建管道
        pid_t pid = fork();  // 创建子进程
        if (pid < 0)
        {
            perror("pipe failed"); // 创建失败
            exit(1);
        }
        else if (pid == 0) // 子进程
        {
            close(fds[1]);   // 关闭写的窗口
            dup2(fds[0], 0); // 重定向到文件0，都从文件0里面读取
            close(fds[0]);   // 关闭窗口
            Slaver();
            exit(0);
        }
        close(fds[0]);
        string s = "process" + i;
        channels.push_back(channel(fds[1], pid, s));
        sleep(1);      
    }
}
int main()
{
    srand((unsigned int)time(NULL)); // 随机数种子;
    
    Init();
    control();  
    // cout<<"*******************************************************"<<endl;
    clean();
}
